#include <iostream>
#include <unistd.h>
#include <signal.h>

void PrintPending(sigset_t &pending)
{
    for (int signo = 31; signo >= 1; signo--)
    {
        if (sigismember(&pending, signo))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout << "\n\n";
}

void handler(int signo)
{
    std::cout << "catch a signo: " << signo << std::endl;
}

int main()
{
    // 0.对2号信号进行自定义捕捉
    //  signal(2,handler);

    // //1.先对2号信号进行屏蔽---数据预备
    // sigset_t bset,oset;    //在堆上开辟的空间，属于用户区
    // sigemptyset(&bset);
    // sigemptyset(&oset);
    // sigaddset(&bset,2);    //此时并没有对2号信号进行屏蔽，并没有设置进入你的进程的task_struct,现在bset只是一个堆上的变量

    // //1.2 调用系统调用，将数据设置进入内核
    // sigprocmask(SIG_SETMASK,&bset,&oset);  //此时就已经将信号屏蔽了

    // //2.重复打印当前进程的pending，看到00000000...00
    // sigset_t pending; 
    // int cnt=0;
    // while(true)
    // {
    //     //2.1 获取
    //     int n=sigpending(&pending);
    //     if(n<0)
    //     continue;
    //     //2.2 打印
    //     PrintPending(pending);

    //     sleep(1);
    //     cnt++;

    //     //2.3 解除阻塞
    //     if(cnt==20)
    //     {
    //         std::cout<<"unlock 2 signo"<<std::endl;
    //         sigprocmask(SIG_SETMASK,&oset,nullptr);
    //     }
    // }

    // 3. 发送2号信号，看到0000000...0010

    // 4. 不是所有信号都能被屏蔽，9号和19信号就不能被屏蔽
    sigset_t bset, oset;
    sigemptyset(&bset);
    sigemptyset(&oset);
    for (int i = 1; i <= 31; i++)
    {
        sigaddset(&bset, i);
    }
    sigprocmask(SIG_SETMASK, &bset, &oset);

    sigset_t pending;
    while (true)
    {
        int n = sigpending(&pending);
        if (n < 0)
            continue;
        PrintPending(pending);
        sleep(1);
    }

    return 0;
}